﻿using System.Collections.Generic;

namespace ImageResizer.FileExplorer.Interface
{
    public interface IFileExplorer
    {
        #region Directory
        /// <summary>
        /// Obtient la liste des fichiers contenus dans le repertoire
        /// </summary>
        /// <param name="rootDirectory">le répertoire à lister</param>
        /// <returns>la liste des fichiers</returns>
        IEnumerable<string> DirectoryListFiles(string rootDirectory);

        /// <summary>
        /// Obtient la liste des fichiers contenus dans le repertoire
        /// </summary>
        /// <param name="rootDirectory">le répertoire à lister</param>
        /// <param name="searchPattern">le pattern de recheche</param>
        /// <returns>la liste des fichiers</returns>
        IEnumerable<string> DirectoryListFiles(string rootDirectory, string searchPattern);

        /// <summary>
        ///  Obtient la liste des dossiers contenus dans le repertoire
        /// </summary>
        /// <param name="rootDirectory">le répertoire à lister</param>
        /// <returns>la liste des sous-dossiers</returns>
        IEnumerable<string> DirectoryListSubDirs(string rootDirectory);

        /// <summary>
        ///  Obtient la liste des dossiers contenus dans le repertoire
        /// </summary>
        /// <param name="rootDirectory">le répertoire à lister</param>
        /// <param name="searchPattern">le pattern de recherche</param>
        /// <returns>la liste des sous-dossiers</returns>
        IEnumerable<string> DirectoryListSubDirs(string rootDirectory, string searchPattern);

        /// <summary>
        /// Créé un dossier
        /// </summary>
        /// <param name="dirpath">le chemin à créer</param>
        /// <returns>le résultat de l'opération (true:ok, fasle:erreur)</returns>
        bool DirectoryCreate(string dirpath);

        /// <summary>
        /// Supprime un dossier
        /// </summary>
        /// <param name="dirpath">le chemin à supprimer</param>
        /// <param name="recursively">si true efface le dossier ansi que son contenu (fichiers + subdirs), si false efface si vide</param>
        /// <returns>le résultat de l'opération (true:ok, fasle:erreur)</returns>
        bool DirectoryDelete(string dirpath, bool recursively);

        /// <summary>
        /// Indique si un répertoire existe
        /// </summary>
        /// <param name="dirpath">le répertoire à tester</param>
        /// <returns>true si le répertoire existe, false sinon</returns>
        bool DirectoryExists(string dirpath);   
        #endregion      
        
        #region Files
        /// <summary>
        /// Supprime un fichier
        /// </summary>
        /// <param name="filepath">le chemin complet du fichier à supprimer</param>
        /// <returns>le résultat de l'opération (true:ok, fasle:erreur)</returns>
        bool FileDelete(string filepath);

        /// <summary>
        /// Indique si un fichier existe
        /// </summary>
        /// <param name="filepath">le fichier à tester</param>
        /// <returns>true si le fichier existe, false sinon</returns>
        bool FileExists(string filepath);

        /// <summary>
        /// Télécharge un fichier
        /// </summary>
        /// <param name="source">la source à télécharger</param>
        /// <param name="destination">la destination</param>
        /// <param name="overwrite">indique si on écrase le fichier destination s'il existe déjà</param>
        /// <returns>le résultat de l'opération (true:ok, fasle:erreur)</returns>
        bool FileDownload(string source, string destination, bool overwrite);

        /// <summary>
        /// Envoi un fichier
        /// </summary>
        /// <param name="source">le chemin du fichier à envoyer</param>
        /// <param name="destination">la destination</param>
        /// <param name="overwrite">indique si on écrase le fichier destination s'il existe déjà</param>
        /// <returns>le résultat de l'opération (true:ok, fasle:erreur)</returns>
        bool FileUpload(string source, string destination, bool overwrite);
        #endregion

        /// <summary>
        /// Obtient le caractère de séparation des chemins
        /// </summary>
        string PathSeparator { get; }
    }
}
